import Request from 'luch-request'
import { useUserStore } from '@/store'

import {
    baseURL,
    requestTimeout,
    contentType,
} from "../config";

function authValidatFail(msg) {
    uni.showToast({
        icon: "error",
        title: msg || '出错啦',
        duration: 2000
    });
    const userStore = useUserStore()
    setTimeout(() => {
        uni.switchTab({
            url: '/pages/my/my'
        })
    }, 1500);
    userStore.userLoginOut()
}
/**
 * @description 处理code异常
 * @param {*} code
 * @param {*} msg
 */
const handleCode = (code, msg) => {
    switch (code) {
        case '00004':
            authValidatFail("请先登陆")
            break;
        case '00001':
            uni.showToast({
                icon: "error",
                title: msg,
                duration: 2000
            });
            break;
        default:
            uni.showToast({
                icon: "error",
                title: msg || `后端接口${code}异常`,
                duration: 2000
            });
            break;
    }
};

/**
 * @description Request初始化
 */
const instance = new Request({
    baseURL,
    timeout: requestTimeout,
    headers: {
        "Content-Type": contentType,
    },
    dataType: 'json',
    // 自定义params 处理函数
    paramsSerializer: null,
    // #ifndef MP-ALIPAY
    responseType: 'text',
    // #endif
    // 注：如果局部custom与全局custom有同名属性，则后面的属性会覆盖前面的属性，相当于Object.assign(全局，局部)
    custom: {}, // 全局自定义参数默认值
    // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
    timeout: 60000,
    // #endif
    // #ifdef APP-PLUS
    sslVerify: true,
    // #endif
    // #ifdef H5
    // 跨域请求时是否携带凭证（cookies）仅H5支持（HBuilderX 2.6.15+）
    withCredentials: false,
    // #endif
    // #ifdef APP-PLUS
    firstIpv4: false, // DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
    // #endif
    // 局部优先级高于全局，返回当前请求的task,options。请勿在此处修改options。非必填
    // getTask: (task, options) => {
    // 相当于设置了请求超时时间500ms
    //   setTimeout(() => {
    //     task.abort()
    //   }, 500)
    // },
    // 全局自定义验证器。参数为statusCode 且必存在，不用判断空情况。
    // validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置
    // 	return statusCode >= 200 && statusCode < 300
    // }
});

instance.interceptors.request.use((config) => { // 可使用async await 做异步操作
    // 演示custom 用处
    if (config.custom.auth) {
        const token = uni.getStorageSync('token')
        if (token) {
            config.header['token'] = token
        } else {
            authValidatFail('请先登陆')
            // 如果token不存在，会取消本次请求
            return Promise.reject(config)
        }
    }
    // 是否请求 出现loading
    if (config.custom.loading) {
        uni.showLoading()
    }
    return config
}, config => { // 可使用async await 做异步操作
    return Promise.reject(config)
})

instance.interceptors.response.use((response) => {
    /* 对响应成功做点什么 可使用async await 做异步操作*/
    if (response.config.custom.verification) { // 演示自定义参数的作用
        return response.data
    }
    if (response.data.code !== '00000') { // 服务端返回的状态码不等于200，则reject()
        handleCode(response.data.code)
        return Promise.reject(response)
    } // return Promise.reject 可使promise状态进入catch
    return response.data.data
}, (response) => {
    /*  对响应错误做点什么 （statusCode !== 200）*/
    console.log(response)
    return Promise.reject(response)
})


export {
    instance
};
